// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef BASE_WIN_SCOPED_PROPVARIANT_H_
#define BASE_WIN_SCOPED_PROPVARIANT_H_

#include <propidl.h>

#include "base/logging.h"
#include "base/macros.h"

namespace base {
namespace win {

    // A PROPVARIANT that is automatically initialized and cleared upon respective
    // construction and destruction of this class.
    class ScopedPropVariant {
    public:
        ScopedPropVariant()
        {
            PropVariantInit(&pv_);
        }

        ~ScopedPropVariant()
        {
            Reset();
        }

        // Returns a pointer to the underlying PROPVARIANT for use as an out param in
        // a function call.
        PROPVARIANT* Receive()
        {
            DCHECK_EQ(pv_.vt, VT_EMPTY);
            return &pv_;
        }

        // Clears the instance to prepare it for re-use (e.g., via Receive).
        void Reset()
        {
            if (pv_.vt != VT_EMPTY) {
                HRESULT result = PropVariantClear(&pv_);
                DCHECK_EQ(result, S_OK);
            }
        }

        const PROPVARIANT& get() const { return pv_; }
        const PROPVARIANT* ptr() const { return &pv_; }

    private:
        PROPVARIANT pv_;

        // Comparison operators for ScopedPropVariant are not supported at this point.
        bool operator==(const ScopedPropVariant&) const;
        bool operator!=(const ScopedPropVariant&) const;
        DISALLOW_COPY_AND_ASSIGN(ScopedPropVariant);
    };

} // namespace win
} // namespace base

#endif // BASE_WIN_SCOPED_PROPVARIANT_H_
